package com.py.framework.service;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.py.framework.entity.AreaEntity;
import com.py.framework.entity.DictDetailEntity;
import com.py.framework.entity.LogEntity;
import com.py.framework.entity.MenuEntity;
import com.py.framework.entity.OfficeEntity;
import com.py.framework.entity.SysMsgEntity;
import com.py.framework.entity.UserEntity;

/**
 * 对外接口鉴权数据Service
 *
 * @author Leegern
 * @date 2018年4月26日
 */
public interface AuthenticationService {

    /**
     * 获取当前用户信息
     *
     * @param jdToken 用户令牌
     * @return 用户信息
     */
    UserEntity getCurrentUserInfo(String jdToken) throws Exception;

    Integer getAreaIdByDeptId(String id);

    /**
     * 获取当前用户所属部门
     *
     * @param jdToken 用户令牌
     * @return 用户所属部门
     */
    OfficeEntity getCurrentUserOffice(String jdToken) throws Exception;

    /**
     * 获取当前用户菜单资源集合
     *
     * @param jdToken 用户令牌
     * @return
     */
    List<MenuEntity> getCurrentUserMenuResources(String jdToken) throws Exception;

    /**
     * 获取当前用户部门以及子部门数据
     *
     * @param jdToken 用户令牌
     * @return
     */
    List<OfficeEntity> getCurrentUserOffices(String jdToken) throws Exception;

    /**
     * 获取当前用户区域以及子区域数据
     *
     * @param jdToken 用户令牌
     * @return
     */
    List<AreaEntity> getCurrentUserAreas(String jdToken) throws Exception;

    /**
     * 检验用户是否有访问此资源权限
     *
     * @param jdToken  用户令牌
     * @param resource 资源
     * @return
     * @throws Exception
     */
    boolean hasValidResource(String jdToken, String resource) throws Exception;

    /**
     * 根据区域Id获取所有下级区域数据
     *
     * @param areaId
     * @return
     */
    List<AreaEntity> getAllAreasById(long areaId);

    /**
     * 获取顶级区域信息
     *
     * @return
     */
    AreaEntity getRootArea();

    /**
     * 获取顶级部门数据
     *
     * @return
     */
    List<OfficeEntity> getRootOffices();

    /**
     * 获取二级区域数据
     *
     * @return
     */
    List<AreaEntity> getSecondAreas();

    /**
     * 根据父区域Id查询子区域信息
     *
     * @param parentId 父区域Id
     * @return
     */
    List<AreaEntity> getAreasByParentId(long parentId);

    /**
     * 根据区域Id集合查询区域信息
     *
     * @param ids 区域Id集合
     * @return
     */
    List<AreaEntity> getAreasByIds(List<Long> ids);

    /**
     * 根据部门Id获取部门信息
     *
     * @param officeId 部门Id
     * @return
     */
    OfficeEntity getOfficeById(long officeId);

    /**
     * 发送消息
     *
     * @param jdToken  用户令牌
     * @param entities 消息集合
     * @return
     */
    int sendSysMsg(String jdToken, List<SysMsgEntity> entities) throws Exception;

    /**
     * 缓存用户会话信息
     *
     * @param jdToken 用户令牌
     * @param user    用户信息
     */
    void putUserSessionData(String jdToken, UserEntity user);

    /**
     * 清空用户会话缓存数据
     *
     * @param jdToken 用户令牌
     */
    void clearUserSessionData(String jdToken);

    /**
     * 日志存入缓冲队列
     *
     * @param entity 日志实体
     */
    void sendLogToQueue(LogEntity entity);

    /**
     * 根据用户Id集合查询用户信息
     *
     * @param ids 用户Id集合
     * @return
     */
    List<UserEntity> getUsersByIds(List<Long> ids);

    /**
     * 根据用户Id获取用户下级所有部门用户信息
     *
     * @param id 用户Id
     * @return
     */
    List<UserEntity> getSubUsersById(long userId);

    /**
     * 根据区域Id获取部门信息
     *
     * @param areaId 区域Id
     * @return
     */
    List<OfficeEntity> getOfficesByAreaId(long areaId);

    /**
     * 获取所有部门数据
     *
     * @return
     */
    List<OfficeEntity> getAllOffices();

    /**
     * 根据字典KEY值获取字典详情数据
     *
     * @param dictKey 字典KEY值
     * @return
     */
    List<DictDetailEntity> getDictDetails(String dictKey);

    /**
     * 查询字典表所有信息
     *
     * @param dictKey 字典KEY值
     * @return
     */
    List<LinkedHashMap> seletctDictInfo();

    /**
     * 根据字典KEY值和明细KEY获取字典详情数据
     *
     * @param dictKey 字典KEY值
     * @param dtlKey  明细KEY值
     * @return
     */
    DictDetailEntity getDictDetail(String dictKey, String dtlKey);

    List<UserEntity> getAllDeptAdmin(List<Long> deptIds);

    /**
     * 获取所有部门数据
     *
     * @return
     */
    List<Map> getLoginTimesByDept();

    List<UserEntity> getDeptAllUsers(String deptId);

    /**
     * 获取部门用户信息
     *
     * @param deptIds
     * @return
     */
    List<Long> getDeptManager(List<Long> deptIds);

	List<UserEntity> getUsers();

}